#ifndef _GTX31X_BOARD_H_
#define _GTX31X_BOARD_H_

#include <config.h>
#include <stdbool.h>

#if _KEYBOARD_FUNCTION_ENABLE_

/* 定义相关通讯管脚 */
#if _BOARD_TYPE_ == _V31_A_BOARD_
// SCL 驱动管脚
#define GTX31X_IIC_SCL_PIN                   GPIO_Pin_17
// SDA 驱动管脚
#define GTX31X_IIC_SDA_PIN                   GPIO_Pin_16
// IRQ 中断管脚
#define GTX31X_IRQ_PIN                       GPIO_Pin_8

#elif _BOARD_TYPE_ == _V33_A_BOARD_
// SCL 驱动管脚
#define GTX31X_IIC_SCL_PIN                   GPIO_Pin_17
// SDA 驱动管脚
#define GTX31X_IIC_SDA_PIN                   GPIO_Pin_8
// IRQ 中断管脚
#define GTX31X_IRQ_PIN                       GPIO_Pin_9

#elif _BOARD_TYPE_ == _V33_B_BOARD_
// SCL 驱动管脚
#define GTX31X_IIC_SCL_PIN                   GPIO_Pin_3
// SDA 驱动管脚
#define GTX31X_IIC_SDA_PIN                   GPIO_Pin_2
// IRQ 中断管脚
#define GTX31X_IRQ_PIN                       GPIO_Pin_1

#elif _BOARD_TYPE_ == _V33_C_BOARD_
// SCL 驱动管脚
#define GTX31X_IIC_SCL_PIN                   GPIO_Pin_16
// SDA 驱动管脚
#define GTX31X_IIC_SDA_PIN                   GPIO_Pin_17
// IRQ 中断管脚
#define GTX31X_IRQ_PIN                       GPIO_Pin_8
#endif

/**
 * @brief 事件类型
 *
 */
typedef enum
{
  GTX31X_SELF_TEST             = 1 << 0, // 设备自检
  GTX31X_DATA_INTERACTION      = 1 << 1, // 数据操作
  GTX31X_KEYSCANF_LOCKED_TIMER = 1 << 2, // 输入保护定时器
} Gtx31xTaskEvent_t;

typedef enum
{
  GTX31X_REGISTER_START,   // 启动
  GTX31X_REGISTER_CONFIRM, // 确认
  GTX31X_REGISTER_RETURN,  // 返回
  GTX31X_REGISTER_END,     // 注册结束
} Gtx31xRegisterStep_t;

// 事件中断回调函数
typedef void (*Gtx31xIrqCallback_t)(void);
// 自检回调方法
typedef void (*Gtx31xDeviceSelfTestTask_t)(void);
// 执行用户操作回调方法
typedef void (*Gtx31xDataInteractionTask_t)(void);
// 键盘禁用定时器
typedef void (*Gtx31xKeyboardDisableTimeout_t)(void);

/**
 * @brief 外部调用方法
 *
 */
typedef struct
{
  Gtx31xIrqCallback_t IrqCallback;                       // 中断回调
  Gtx31xDeviceSelfTestTask_t DeviceSelfTestTask;         // 设备自检任务
  Gtx31xDataInteractionTask_t DataInteractionTask;       // 数据交换任务
  Gtx31xKeyboardDisableTimeout_t KeyboardDisableTimeout; // 键盘禁用超时回调
} Gtx31xExternalInterfaces_t;

/**
 * @brief 微秒延时
 *
 * @param Us - 延时的时间
 */
extern void Gtx31xDelayUs(uint16_t Us);

/**
 * @brief 毫秒延时
 *
 * @param Us - 延时的时间
 */
extern void Gtx31xDelayMs(uint16_t Ms);

/**
 * @brief 设置SCL时间线管脚电平状态
 *
 * @param PinLevel - 管脚电平（true：高电平 false：低电平）
 */
extern void Gtx31xSetSclPinLevel(bool PinLevel);

/**
 * @brief 设置SDA数据线管脚电平状态
 *
 * @param PinLevel - 管脚电平（true：高电平 false：低电平）
 */
extern void Gtx31xSetSdaPinLevel(bool PinLevel);

/**
 * @brief 获取 SDA 数据线管脚电平状态
 *
 * @return bool - 管脚电平状态（true：高电平 false：低电平）
 */
extern bool Gtx31xGetSdaPinLevel(void);

/**
 * @brief 将SDA设置为输入模式
 *
 */
extern void Gtx31xConfigurationSdaInput(void);

/**
 * @brief 将SDA设置为输出模式
 *
 */
extern void Gtx31xConfigurationSdaOutput(void);

/**
 * @brief 使能中断
 *
 */
extern void Gtx31xEnableTouchInterrupts(void);

/**
 * @brief 失能中断
 *
 */
extern void Gtx31xMaskedTouchInterrupts(void);

/**
 * @brief 获取键盘灵敏度
 *
 * @return uint8_t - 键盘灵敏度
 */
extern uint8_t Gtx31xGetKeyboardSensitivity(void);

/**
 * @brief 获取键入超时时间
 *
 * @return uint32_t - 键入超时时间
 */
extern uint32_t GetKeyScanfTimeout(void);

/**
 * @brief 失能写寄存器保护
 *
 */
extern void Gtx31xDiableWriteRegisterProtection(void);

/**
 * @brief 使能写寄存器保护
 *
 */
extern void Gtx31xEnableWriteRegisterProtection(void);

/**
 * @brief 播放按键音效
 *
 */
extern void Gtx31xPlayKeypadTone(void);

/**
 * @brief 播放密钥输入错误音效
 *
 */
extern void Gtx31xPlayTheKeyEntryErrorSoundEffect(void);

/**
 * @brief 播发权限不足提示音
 *
 */
extern void Gtx31xPlayPermissionDeniedAudio(void);

/**
 * @brief 播放请验证管理员提示音
 *
 */
extern void Gtx31xPlayVerifyAdminPasswordAudio(void);

/**
 * @brief 播放密钥比对不一致音效
 *
 */
extern void Gtx31xPlayKeyComparisonErrorSound(void);

/**
 * @brief 上报进入唤醒模式
 *
 * @return bool - 上报状态（true：成功 false：失败）
 */
extern bool Gtx31xReportWakeup(void);

/**
 * @brief 上报进入待机模式
 *
 * @return bool - 上报状态（true：成功 false：失败）
 */
extern bool Gtx31xReportIntoStandby(void);

/**
 * @brief 上报退出键入
 *
 * @return bool - 上报状态（true：成功 false：失败）
 */
extern bool Gtx31xReportExitTyping(void);

/**
 * @brief 获取播放完毕标志
 *
 * @return bool - 空闲标志（true：繁忙 false：空闲）
 */
extern bool Gtx31xGetPlaybackCompletionFlag(void);

/**
 * @brief 获取外部验证传感器使能位
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool Gtx31xGetExternalVerificationSensorEn(void);

/**
 * @brief 上报自检结果
 *
 * @param Result - 自检结果（true：成功 false：失败）
 */
extern void Gtx31xReportgSeltTestResult(bool Result);

/**
 * @brief 验证管理员密码有效性
 *
 * @param pPassowrdIn - 待验证的密码
 * @param NumberOfKey - 待验证密钥长度
 * @return bool       - 验证状态（true：成功 false：失败）
 */
extern bool Gtx31xVerifyAdminPasswordValidity(const void *pPassowrdIn, uint8_t NumberOfKey);

/**
 * @brief 本地注册前的准备
 *
 */
extern void Gtx31xPreparationsBeforeLocalRegister(void);

/**
 * @brief 更新录入状态
 *
 * @param RegisterStep - 注册步骤
 */
extern void Gtx31xUpdateLocalEntryStatus(Gtx31xRegisterStep_t RegisterStep);

/**
 * @brief 重置本地注册超时时间
 *
 */
extern void Gtx31xReloadLocalRegisterTimer(void);

/**
 * @brief 获取设备繁忙标识
 * 
 * @return bool - 设备繁忙标识（true：繁忙 false：空闲）
 */
extern bool Gtx31xGetDeviceBusyEn(void);

/**
 * @brief 上报用户键入键值
 *
 * @param pKeyValue   - 用户键入键值
 * @param NumberOfKey - 键值数量
 * @return bool       - 上报状态（true：成功 false：失败）
 */
extern bool Gtx31xReportUserTypedKeys(const void *pKeyValue, uint8_t NumberOfKey);

/**
 * @brief 重置键盘输入超时
 *
 * @return bool - 重置状态（true：成功 false：失败）
 */
extern bool Gtx31xResetKeyTypedTimeout(void);

/**
 * @brief 停止设备自检任务
 *
 */
extern void Gtx31xStopDeviceSelfTestTask(void);

/**
 * @brief 延时启动设备自建任务
 *
 * @param Ms - 延时的时间
 */
extern void Gtx31xDelayedStartDeviceSelfTestTask(uint32_t Ms);

/**
 * @brief 立即启动设备自检任务
 *
 */
extern void Gtx31xStartDeviceSelfTestTaskNoWait(void);

/**
 * @brief 停止数据处理任务
 *
 */
extern void Gtx31xStopDataInteractionTask(void);

/**
 * @brief 延时启动数据处理任务
 *
 * @param Ms - 延时的时间
 */
extern void Gtx31xDelayedStartDataInteractionTask(uint32_t Ms);

/**
 * @brief 立即启动数据处理任务
 *
 */
extern void Gtx31xStartDataInteractionTaskNoWait(void);

/**
 * @brief 禁用键盘输入定时器
 *
 */
extern void Gtx31xStopKeyscanfDiabledTimer(void);

/**
 * @brief 启动键盘禁用定时器
 *
 * @param DisableTime - 禁用时间
 */
extern void Gtx31xStartKeyscanfDiabledTimer(uint32_t DisableTime);

/**
 * @brief 标志键盘禁用超时
 *
 */
extern void Gtx31xMarkStartKeyscanfDiabledTimeout(void);

/**
 * @brief 板载功能初始化
 *
 * @param pExternalInterfaces - 外部调用的方法
 */
extern void Gtx31xBoardInitialisation(Gtx31xExternalInterfaces_t *pExternalInterfaces);

#endif
#endif
